#include "widget.h"
#include "config.h"
#include"heroplane.h"
#include"bullet.h"
#include <QIcon>
#include <QPainter>
#include <QDebug>
#include <ctime>
#include <QMessageBox>
#include<QMouseEvent>
#include"bomb.h"
#include<QSound>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //初始化场景
    initScene();
    //启动游戏
   playGame();

}

Widget::~Widget()
{
}
void Widget::initScene()
{
    //设置窗口尺寸及标题图标
    setFixedSize(GAME_WIDTH, GAME_HEIGHT);
    setWindowTitle(GAME_TITLE);
    setWindowIcon(QIcon(GAME_ICON));
    //定时器设置
    m_Timer.setInterval(GAME_INTERVAL);
    m_recorder=0;
        //时间随机种子
        srand((unsigned int)time(NULL));
}
void Widget::playGame()
{
    // bgm
        QSound::play(SOUND_BGM);

//启动定时器
    m_Timer.start();
connect(&m_Timer, &QTimer::timeout, [=](){

    //更新元素
     updatePosition();
     //敌机出场
      enemytoscene();
   //更新绘制
      update();
collisionDetection();
});
}
void Widget::updatePosition()
{
    //更新地图坐标
    m_map.mapPosition();
    //发射子弹
        m_hero.shoot();
        //计算所有非空闲子弹的坐标
        for(int i=0;i<BULLET_NUM;i++){
            //
            if(m_hero.m_bullet[i].m_Free==false){
                m_hero.m_bullet[i].updatePosition();
            }
        }
        //敌机出场
        for(int i=0;i<ENEMY_NUM;i++){
            if(m_enemy[i].m_Free==false){
                m_enemy[i].updatePosition();
            }
           }
        //计算爆炸播放的图片
            for(int i=0;i<BOMB_NUM;i++){
                if(m_bomb[i].m_Free==false){
                    //切图
                    m_bomb[i].updateInfo();
                }
            }
 }
//绘制
void Widget::paintEvent(QPaintEvent *){

    QPainter painter(this);

    //绘制地图
    painter.drawPixmap(0, m_map.m_map1_posY, m_map.m_map1);
    painter.drawPixmap(0, m_map.m_map2_posY, m_map.m_map2);
    //绘制英雄飞机
        painter.drawPixmap(m_hero.m_X,m_hero.m_Y,m_hero.m_Plane);
        //绘制子弹
        for(int i=0;i<BULLET_NUM;i++){
            //
            if(m_hero.m_bullet[i].m_Free==false){
                painter.drawPixmap(m_hero.m_bullet[i].m_X,m_hero.m_bullet[i].m_Y,m_hero.m_bullet[i].m_Bullet);
            }
    }
        //绘制敌机
    for(int i=0;i<ENEMY_NUM;i++){
        if(m_enemy[i].m_Free==false){
            painter.drawPixmap(m_enemy[i].m_X,m_enemy[i].m_Y,m_enemy[i].m_enemy);

    }
    }
    //绘制爆炸
    for(int i=0;i<BOMB_NUM;i++){
        if(m_bomb[i].m_Free==false){
            //切图
painter.drawPixmap(m_bomb[i].m_X,m_bomb[i].m_Y,m_bomb[i].m_pixArr[m_bomb[i].m_index]);

        }
    }
}
void Widget::mouseMoveEvent(QMouseEvent *event){//计算鼠标按下的位置
  int x=  event->x()-m_hero.m_Rect.width()*0.5;
   int y= event->y()-m_hero.m_Rect.height()*0.5;

   //边界检测
   if(x<=0){
       x=0;//
   }
   if(x>=GAME_WIDTH-m_hero.m_Rect.width()){
       x=GAME_WIDTH-m_hero.m_Rect.width();//
   }
   if(y<=0){
       y=0;
   }
   if(y>=GAME_HEIGHT-m_hero.m_Rect.height()){
      y= GAME_HEIGHT-m_hero.m_Rect.height();
   }
   m_hero.setPosition(x,y);
   //发现拖拽点不在中央，要偏移
}
void Widget::enemytoscene()
{
    m_recorder++;
    if(m_recorder<ENEMY_INTERVAL){
        return;}
        m_recorder=0;
        for(int i=0;i<ENEMY_NUM;i++){
          //
            if(m_enemy[i].m_Free){
                m_enemy[i].m_Free=false;

                //敌机坐标
                m_enemy[i].m_X=rand()%(GAME_WIDTH-m_enemy[i].m_Rect.width());
                m_enemy[i].m_Y=0-m_enemy[i].m_Rect.height();
                break;
            }
        }
}
void Widget::collisionDetection()
{
    //遍历所有的非空闲的敌机
    for(int i=0;i<ENEMY_NUM;i++){
      //空闲的飞机，执行下一次循环
        if(m_enemy[i].m_Free){
continue;
    }
        //遍历所有的非空闲的子弹
        for(int j=0;j<BULLET_NUM;j++){
            if(m_hero.m_bullet[j].m_Free){
                continue;
            }

        //碰撞检测---子弹和飞机相交，发生碰撞，同时将飞机和子弹空闲状态设为真
       if(m_enemy[i].m_Rect.intersects(m_hero.m_bullet[j].m_Rect)){
           m_enemy[i].m_Free=true;
                   m_hero.m_bullet[j].m_Free=true;
                   //播放爆炸效果
                   for(int k=0;k<BOMB_NUM;k++){
                       if(m_bomb[k].m_Free){
                           //空闲的爆炸，可以播放
 QSound::play(SOUND_BOMB);
             m_bomb[k].m_Free=false;
                 //更新爆炸坐标
                 m_bomb[k].m_X=m_enemy[i].m_X;
                 m_bomb[k].m_Y=m_enemy[i].m_Y;
                 break;
                       }
                   }
       }
}
        }
}
